Оркестрант: компиляторный драйвер
Представьте, что компиляторный драйвер (например, как GCC) как великолепный дирижёр. Он автоматизирует сложную трансформацию из читаемого человеком исходного кода в бинарный исполняемый файл. Этот путь — Путь к выполнению, начинается с времени компиляции и продолжается до времени загрузки и времени выполнения.
Используя отдельную компиляцию, драйвер обрабатывает main.c и sum.c независимо. Изменения в одном модуле не требуют повторной трансляции всего проекта — только изменённый файл проходит через препроцессор (cpp), компилятор (cc1), ассемблер (as) перед тем, как линкер (ld) объединяет полученные перемещаемые объектные файлы.
Эффективность и иерархия памяти
Решения линкера по размещению для grid[0][0] или src[0][0] непосредственно влияют на Пропускную способность и Задержку. Выравнивание данных в строке кэша размером 32 байта, драйвер обеспечивает шаблон обращений с шагом 1, минимизируя холодные промахи и избегая вытеснений при сканировании по столбцам. В продвинутых высокопроизводительных кодах, параллелизм раскрученных циклов ($4 \times 4$ раскрученный цикл) дополнительно маскирует отображение основной памяти в кэш задержки за счёт оптимизации циклов частоты тактирования (0x32, 0x1, 0x4, 0x51).